//
// Created by mi on 2024/5/6.
//

#include <iostream>
#include <thread>

using namespace std;
//std::jthread修复了std::thread不是RAII类型的设计缺陷，并且增加了能够主动取消或停止线程执行的新特性。
// 选择引入了一个std::jthread，而不是在原有的std::thread上添加新接口，主要原因是为了向后兼容
int main(int argc, char *argv[]) {
    std::jthread nonInterruptable([]() {
        int counter{0};
        while (counter < 10) { // 不可以接收终止请求
            std::this_thread::sleep_for(0.2s); // CPP真是越来越好用了
            std::cerr << "non-interruptable thread: " << counter << '\n';
            ++counter;
        }
    });
    std::jthread interrupttible(
            [](std::stop_token stoken) {
                int counter{0};
                while (counter < 10) {
                    std::this_thread::sleep_for(0.2s);
                    if (stoken.stop_requested()) return; // 可以接收终止请求
                    std::cerr << "interruptible" << counter << endl;
                    ++counter;
                }
            });
    std::this_thread::sleep_for(1s);
    std::cerr << endl;
    nonInterruptable.request_stop(); // 发送终止请求,但是并没有用
    interrupttible.request_stop(); // 发送终止请求,成功让线程终止
    cout << endl;
    return 0;
}